#pragma once

#include <iostream>
#include <string>

#include "Tool.hpp"

namespace Log_NS
{
    using namespace Tool_NS;

    // 开放性日志
    // #宏 就可以使宏以字符串的方式展示
    // __FILE__ 表示当前文件名
    // __LINE__ 表示当前行号。
    #define LOG(level) Log(#level,__FILE__,__LINE__)

    // 日志等级
    enum
    {
        Debug = 0, // 调试
        Info,      // 正常
        Warning,   // 警告
        Error,     // 错误，但程序并未直接退出
        Fatal      // 程序直接挂掉
    };

    // 由于日志可能会被大量调用，这里我们将日志设置为内联函数
    inline std::ostream& Log(const std::string & level, const std::string &file_name, int line)
    {
        // 添加日志等级
        std::string message = "[" + level + "]";

        // 添加调用日志的文件的文件名
        message += ("[" + file_name + "]");

        // 添加调用日志的行数
        message += ("[" + std::to_string(line) + "]");

        // 添加时间戳
        message += ("[" + TimeTool::GetTimeStamp() + "]");

        // cout中有缓冲区，将可以将信息暂存到cout中
        // 这里不要使用endl或\n将缓冲区中的数据刷新出来
        std::cout << message;  

        return std::cout;
    }
}